package twoday.one;

import org.junit.Test;

/**
 * Created by ZPF on 2019/10/30.
 */
public class Demo1 {
    @Test
    public void func1(){
        MyEnum myEnum = MyEnum.A;
        System.out.println(myEnum.ordinal()); //ordinal 返回枚举常量在枚举类中声明的序号，第一个枚举常量序号为0

        System.out.println(myEnum.name());//把枚举项转换成字符串
        MyEnum myEnum1 = MyEnum.valueOf("B");//把字符串转换成枚举项
    }

    /*
     * 枚举可以在switch语句中使用
     * switch（byte、char、short、int、枚举）
     */
    @Test
    public void func2(){
        MyEnum myEnum = MyEnum.A;
        switch (myEnum){
            case A:
                System.out.println("A");
                break;
            case B:
                System.out.println("B");
                break;
            case C:
                System.out.println("C");
                break;
            default:
                System.out.println("default");
                break;
        }
    }

    @Test
    /*
     * 枚举项如同多例类一样，在加载类的时候就创建了实例。
     */
    public void func3() throws ClassNotFoundException{
        Class.forName("twoday.one.MyEnum2");
    }

    @Test
    /*
     * 枚举类的value()方法测试
     */
    public void func4(){
        Myenum4[] myenum4s = Myenum4.values();
        for(Myenum4 m : myenum4s){
            System.out.println(m + "(" +  m.getOrdinal() +  ", " + m.getMessage() + ")");
        }
    }
}
/*
 * 创建枚举类语法：
 * 使用enum关键字
 * 类体中只需给出枚举项，多个枚举项之间使用逗号分隔
 * 枚举类中可以使用构造器，方法和实例变量
 * 如果枚举类中只有枚举项，可以省略最后一个枚举项后面的分号
 */
enum MyEnum{
    A,B,C;

    MyEnum(){}

    private String name;

    public String getName(){
        return name;
    }
}

/*
 * 定义枚举项，指定调用的构造器，并传递参数。
 * 枚举类在实际编译过程中使用的还是public static final MyEnum A = new MyEnum();
 * 重载了构造函数，所以A(要传入的参数和构造函数的参数一致)
 */
enum MyEnum2{
    A("AAA"), B("BBB"), C("CCC");
     MyEnum2(String name){
        System.out.println(name);
    }

}
/*
 * 如果枚举类中包含抽象方法
 * 对每个枚举项进行使用内部类来实现
 */
enum MyEnum3{
    A(){
        @Override
        public void function() {
            System.out.println("AAAAA");
        }
    }, B(){
        @Override
        public void function() {
            System.out.println("BBBBB");
        }
    }, C(){
        @Override
        public void function() {
            System.out.println("CCCCC");
        }

    };

    public abstract void function();
}

enum Myenum4{
    A(1,"AAA"), B(2,"BBB"), C(3,"CCC");
    private String message;
    private int ordinal;
     Myenum4(int i, String s){
        message = s;
        ordinal = i;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public int getOrdinal() {
        return ordinal;
    }

    public void setOrdinal(int ordinal) {
        this.ordinal = ordinal;
    }
}

/*
 * 创建多例类
 */
/*class MyEnum{
    public static final MyEnum A = new MyEnum();
    public static final MyEnum B = new MyEnum();
    public static final MyEnum C = new MyEnum();
    private MyEnum(){

    }
    public void hello(){
        System.out.println("hello!");
    }
    public static MyEnum valueOf(String s){
        if(s.equals("A")){
            return A;
        }
        else if(s.equals("B")){
            return  B;
        }
        else {
            return C;
        }
    }
}*/
